package tech.aistar.day01;

/**
 * 本类用来演示: 方法的定义和使用
 *
 * @author: success
 * @date: 2022/7/18 3:07 下午
 */
public class MethodTest {
    static public void main(String[] args) {

        //原则:属于谁,就会被谁调用.
        //static修饰的成员member[属性/方法],初始化的时机
        //当jvm加载类进内存的时候,就会立即给所有的静态的成员分配空间以及初始化.并且仅仅只会初始化一次.
        //因此static修饰的成员是属于类的.

        //非静态的属性是何时分配空间和初始化的呢?
        //只要每次创建对象的时候,就会对这个对象中的非静态的成员分配空间以及初始化
        //非静态的成员是属于对象拥有的.

        //方法的调用
        //静态方法 - 通过类名调用
        MethodTest.add2();

        //非静态方法 - 必须要创建一个类的对象
        //什么类 = 方法所在类
        //类名 对象名 = new 类名();

        //本质:
        //①通过new关键字在jvm的堆空间创建了一个区域,创建了一个对象,
        //②并且进行初始化
        //③将这个对象在堆空间中的内存地址赋值给了一个引用变量m,存储在JVM的栈中.

        //真实的顺序,经过jvm的指令优化
        //①通过new关键字在jvm的堆空间创建了一个区域,创建了一个对象,
        //②将这个对象在堆空间中的内存地址赋值给了一个引用变量m,存储在JVM的栈中.
        //③并且进行初始化

        //所以m是引用,引用保存的是地址
        MethodTest m = new MethodTest();
        //System.out.println(m);//tech.aistar.day01.MethodTest@330bedb4
        m.add();
    }

    //定义一个公开的无返回类型的并且没有参数的方法
    public void add(){
        System.out.println("add...");
    }

    //定义一个公开的静态的无返回类型的并且没有参数的方法
    //修饰符之间是没有顺序的
    public static void add2(){
        System.out.println("add2...");
    }

}
